package fr.auzaiphe.admin.model;

import java.sql.Timestamp;

import fr.auzaiphe.commun.Model;


/**
 *
 * @author Hugp
 * Classe mere de gestion du chronometre.
 * On implémente Runnable pour définir le Chrono en tant qu'executable
 * Cependant on déclare également un Thread dans la classe pour séparer
 * la décrémentation du reste.
 * La gestion du Thread se fera ainsi sans erreur!
 */
public abstract class Chrono implements Runnable
{
	protected Model model;

	protected int tempsRestant;

	protected Thread threadChrono;
	protected boolean run;

	/**
	 * Constructeur.
	 * Met le tempsRestant a zero et initialise la liste d'Alertes (flagAlertes).
	 */
	public Chrono ( Model pModel)
	{
		super();
		this.tempsRestant = 0;
		this.model = pModel;
	}

	/**
	 * Constructeur
	 * @param pTempsRestant temps initial du chrono
	 */
	public Chrono (int pTempsRestant, Model pModel)
	{
		this.tempsRestant = pTempsRestant;
		this.model = pModel;
	}

	/**
	 * Demarre proprement le thread du Chrono
	 */
	public void start()
	{
		if( this.threadChrono == null )
		{
			this.threadChrono = new Thread(this);
			this.run = true;
			this.threadChrono.start();
		}
	}

	public void interrupt()
	{
		if( this.threadChrono != null )
		{
			this.run = false;
			this.threadChrono=null;
		}
	}

	public void destroy()
	{
		if( this.threadChrono != null )
		{
			this.threadChrono.interrupt();
			this.threadChrono=null;
		}
	}

	/**
	 * getSecondesRestantes
	 * @return Retourne le temps restant du chrono en secondes sous forme d'entier.
	 */
	public int getSecondesRestantes()
	{
		return this.tempsRestant;
	}

	/**
	 * getTempsRestant
	 * @return Le temps restant sous forme de Timestamp. Peut être pratique pour le retranscrire en chrono.
	 */
	public Timestamp getTempsRestant()
	{
		return new Timestamp(this.tempsRestant*1000);
	}

	/**
	 * setTempsRestant : modifie le temps restant
	 * @param tempsRestant
	 */
	public void setTempsRestant(int pTempsRestant)
	{
		this.tempsRestant = pTempsRestant;
	}

	/**
	 * setTempsRestant : modifie le temps restant en entrant un TimeStamp
	 * @param tempsRestant
	 */
	public void setTempsRestant(Timestamp pTempsRestant)
	{
		this.tempsRestant = pTempsRestant.getSeconds();
	}

	public boolean equals(Chrono pChrono)
	{
		return
			(pChrono instanceof Chrono) &&
			pChrono.getSecondesRestantes() == this.tempsRestant;
	}
}
